package main

import "fmt"

//var a int = 100 //声明变量a
	//var p * int		//声明整数类型的指证 p，存放的都是地址
	//
	//p = &a	// &取地址符 把a变量的地址赋值给 p
	//fmt.Printf("a变量的地址是：%x \n",&a)
	//fmt.Printf("p的值是%x \n",p)
	//fmt.Printf("p变量的地址是：%x \n",&p)
	//
	///*
	//当一个指证定义之后没有分配任何变量时，它的值就是nil
	//nil 指证也称为空指证，nil在概念上和其他语言的nll，None都是一样的
	// */
	//
	//var ptr * int
	//var b int
	//fmt.Printf("ptr的值为：%v %d \n", ptr, ptr)
	//fmt.Println("b的默认值是：",b)
	//
	////使用指证访问值
	//fmt.Printf("*p变量的值是：%d \n",*p)
	//
	//*p = 300
	//fmt.Printf("*p变量的值：%d, a变量的值：%d", *p, a)

/*
函数参数传递：
值传递：拷贝一份新数据给函数体，修改函数的局部变量不会影响外部的实参
引用传递：传递地址，修改函数局部变量会影响外部实参

go语言的传参是一个值传递
使用指证可以达到引用传递的效果
 */

func main(){
	num := 100
	fmt.Println("num的地址是：",&num)
	add(num)
	add2(&num)
	fmt.Println("执行完add2后，num的值是:", num)
	//判断空指针
	//if (ptr == nil) {
	//
	//}
}

func add(x int) {
	fmt.Println("x的地址是：", &x)
	x = 200
	fmt.Println("x的地址是：",&x,"x的值是：",x)
}

func add2(y *int){
	fmt.Println("y的地址是：" ,&y)
	fmt.Println("y的值是：",y)
	*y = 300
}

